home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 April / EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso / EARCD / comm / bbs / Hydra11s.lha / HBBS / Source / Test / new_Timer.c < prev    next >
C/C++ Source or Header  |  1996-06-25  |  3KB  |  118 lines

  1. struct TimerData *SubmitTimer(struct TimerSetupData *TSD, ULONG Seconds,ULONG MicroSeconds )
  2. {
  3.   struct TimerData *TD=NULL;
  4.  
  5.   if (TD=(struct TimerData*)AllocVec(sizeof(struct TimerData),MEMF_PUBLIC))
  6.   {
  7.     // copy fields accross from our blank timer IO request
  8.     // that was initialised by InitTimer();
  9.  
  10.     //      Source             Dest   Size
  11.     CopyMem(TSD->BlankTimerIO,&TD->TR,sizeof(struct timerequest));
  12.  
  13.     TD->TR.tr_time.tv_secs   = Seconds;
  14.     TD->TR.tr_time.tv_micro   = MicroSeconds;
  15.     AddHead(TSD->TimerList,(struct Node*)TD);
  16.  
  17.     SendIO((struct IORequest *)&TD->TR);
  18.   }
  19.   return(TD);
  20. }
  21.  
  22. void AbortTimer(struct TimerSetupData *TSD, struct TimerData *CTD)
  23. {
  24.   struct TimerData *TD=NULL;
  25.  
  26.   for (TD = (struct TimerData *)TSD->TimerList->lh_Head ; TD->node.ln_Succ ; TD =(struct TimerData *) TD->node.ln_Succ)
  27.   {
  28.     if (TD==CTD)
  29.     {
  30.       AbortIO((struct IORequest *)&TD->TR);
  31.       WaitIO((struct IORequest *)&TD->TR);
  32.       FreeVec(TD);
  33.       // TD is now null so we dont wat to reference it again so return from the func..
  34.       return;
  35.     }
  36.   }
  37. }
  38.  
  39. BOOL CheckTimer(struct TimerSetupData *TSD, struct TimerData *CTD)
  40. {
  41.   struct TimerData *TD=NULL;
  42.  
  43.   for (TD = (struct TimerData *)TSD->TimerList->lh_Head ; TD->node.ln_Succ ; TD =(struct TimerData *) TD->node.ln_Succ)
  44.   {
  45.     if (TD==CTD)
  46.     {
  47.       if (CheckIO((struct IORequest *)&TD->TR))
  48.       {
  49.         Remove((struct Node*)TD);
  50.         FreeVec(TD);
  51.         return(TRUE);
  52.       }
  53.     }
  54.   }
  55.   return(FALSE);
  56. }
  57.  
  58. void CleanupTimer( struct TimerSetupData *TSD )
  59. {
  60.   if (TSD)
  61.   {
  62.     if (TSD->TP)
  63.     {
  64.       if (TSD->BlankTimerIO)
  65.       {
  66.         if (TSD->TimerOpen)
  67.         {
  68.           if (TSD->TimerList)
  69.           {
  70.             // remove all outstanding io requests..
  71.             for (TD = (struct TimerData *)TSD->TimerList->lh_Head ; TD->node.ln_Succ ; TD =(struct TimerData *) TD->node.ln_Succ)
  72.             {
  73.               AbortIO((struct IORequest *)&TD->TR);
  74.               WaitIO((struct IORequest *)&TD->TR);
  75.               FreeVec(TD);
  76.               }
  77.             }
  78.             FreeVec(TSD->TimerList);
  79.           }
  80.           CloseDevice((struct IORequest *) TSD->BlankTimerIO);
  81.           TSD->TimerOpen=FALSE;
  82.         }
  83.         DeleteExtIO((struct IORequest *) TSD->BlankTimerIO);
  84.       }
  85.       DeleteMsgPort(TSD->TP);
  86.     }
  87.     FreeVec(TSD);
  88.   }
  89. }
  90.  
  91. struct TimerSetupData *InitTimer( void )
  92. {
  93.   struct TimerSetupData *TSD;
  94.  
  95.   if (TSD=AllocVec(sizeof(struct TimerSetupData),MEMF_PUBLIC))
  96.   {
  97.     TSD->TimerOpen=FALSE;
  98.     if (TSD->TimerPort = CreateMsgPort())
  99.     {
  100.       if (TSD->BlankTimerIO = (struct timerequest *) CreateExtIO(TSD->TimerPort,sizeof(struct timerequest)) )
  101.       {
  102.         if (OpenDevice( TIMERNAME, UNIT_VBLANK,(struct IORequest *) TSD->BlankTimerIO, 0L)==0) // success ?
  103.         {
  104.           TSD->TimerOpen=TRUE;
  105.           TSD->BlankTimerIO->tr_node.io_Command = TR_ADDREQUEST;
  106.           if (TSD->TimerList=AllocVec(sizeof(struct List),MEMF_PUBLIC))
  107.           {
  108.             NewList((struct List *)TSD);
  109.             return(TSD);
  110.           }
  111.         }
  112.       }
  113.     }
  114.     CleanupTimer(TSD);
  115.   }
  116.   return(NULL);
  117. }
  118.